package org.aplombh.java.awcing.basic.greedy.huffman;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;

/**
 * 在一个果园里，达达已经将所有的果子打了下来，而且按果子的不同种类分成了不同的堆。
 * <p>
 * 达达决定把所有的果子合成一堆。
 * <p>
 * 每一次合并，达达可以把两堆果子合并到一起，消耗的体力等于两堆果子的重量之和。
 * <p>
 * 可以看出，所有的果子经过 n−1 次合并之后，就只剩下一堆了。
 * <p>
 * 达达在合并果子时总共消耗的体力等于每次合并所耗体力之和。
 * <p>
 * 因为还要花大力气把这些果子搬回家，所以达达在合并果子时要尽可能地节省体力。
 * <p>
 * 假定每个果子重量都为 1，并且已知果子的种类数和每种果子的数目，你的任务是设计出合并的次序方案，使达达耗费的体力最少，并输出这个最小的体力耗费值。
 * <p>
 * 例如有 3 种果子，数目依次为 1，2，9。
 * <p>
 * 可以先将 1、2 堆合并，新堆数目为 3，耗费体力为 3。
 * <p>
 * 接着，将新堆与原先的第三堆合并，又得到新的堆，数目为 12，耗费体力为 12。
 * <p>
 * 所以达达总共耗费体力=3+12=15。
 * <p>
 * 可以证明 15 为最小的体力耗费值。
 * <p>
 * 输入格式
 * 输入包括两行，第一行是一个整数 n，表示果子的种类数。
 * <p>
 * 第二行包含 n 个整数，用空格分隔，第 i 个整数 ai 是第 i 种果子的数目。
 * <p>
 * 输出格式
 * 输出包括一行，这一行只包含一个整数，也就是最小的体力耗费值。
 * <p>
 * 输入数据保证这个值小于 231。
 * <p>
 * 数据范围
 * 1≤n≤10000,
 * 1≤ai≤20000
 * 输入样例：
 * 3
 * 1 2 9
 * 输出样例：
 * 15
 */
public class MergeFruits_148 {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(reader.readLine());
        MergeFruits mf = new MergeFruits();
        String[] s = reader.readLine().split(" ");
        for (int i = 0; i < n; i++) {
            mf.heap.add(Integer.parseInt(s[i]));
        }
        System.out.println(mf.solve());
    }
}

class MergeFruits {
    PriorityQueue<Integer> heap = new PriorityQueue<>();

    public int solve() {
        int res = 0;

        while (heap.size() > 1) {
            int a = heap.peek();
            heap.remove();
            int b = heap.peek();
            heap.remove();

            res += a + b;
            System.out.println("merge " + a + " and " + b +", become " + (a + b) + ", Cost is " + (a+b) + ", The total cost is " + res);
            heap.add(a + b);
        }


        return res;
    }
}
